package main

import (
	"fmt"
	"time"

	"gopkg.in/mgo.v2"
)

// MongoDB 连接配置
type Config struct {
	Host     string
	Port     int
	Username string
	Password string
	Database string
	Timeout  time.Duration // 连接超时时间
	SSL      bool          // 是否使用SSL
}

var session *mgo.Session

// ConnectMongoDB 连接MongoDB数据库（带连接池）
func ConnectMongoDB(cfg Config) (*mgo.Session, error) {
	dialInfo := &mgo.DialInfo{
		Addrs:    []string{fmt.Sprintf("%s:%d", cfg.Host, cfg.Port)},
		Database: cfg.Database,
		Timeout:  cfg.Timeout,
	}

	if cfg.Username != "" {
		dialInfo.Username = cfg.Username
		dialInfo.Password = cfg.Password
	}

	// 建立初始连接
	s, err := mgo.DialWithInfo(dialInfo)
	if err != nil {
		return nil, fmt.Errorf("mgo连接失败: %v", err)
	}

	// 测试连接
	if err = s.Ping(); err != nil {
		return nil, fmt.Errorf("mgo连接测试失败: %v", err)
	}

	// 设置连接池参数
	s.SetPoolLimit(100)                  // 连接池大小
	s.SetSocketTimeout(30 * time.Minute) // socket超时时间
	s.SetSyncTimeout(1 * time.Minute)    // 同步超时

	session = s
	return session, nil
}

// GetSession 获取数据库会话副本
func GetSession() *mgo.Session {
	if session == nil {
		panic("mgo session not initialized")
	}
	return session
}

// 初始化连接
func DBInit() {
	cfg := Config{
		Host:     "localhost",
		Port:     27017,
		Username: "",
		Password: "",
		Database: "mybook",
		Timeout:  10 * time.Second,
	}

	var err error
	session, err = ConnectMongoDB(cfg)
	if err != nil {
		panic(err)
	}
}
